package com.bank.mapper;

import com.bank.entity.CardInfo;
import org.apache.ibatis.annotations.*;
import java.util.List;

/**
 * 银行卡信息数据访问接口
 * 提供对cardInfo表的增删改查操作
 * 使用MyBatis注解方式实现SQL映射
 */
@Mapper
public interface CardInfoMapper {
    /**
     * 查询所有银行卡信息
     * @return 银行卡信息列表
     */
    @Select("SELECT * FROM cardInfo")
    List<CardInfo> findAll();

    /**
     * 根据卡号查询银行卡信息
     * @param cardID 银行卡号
     * @return 银行卡信息对象
     */
    @Select("SELECT * FROM cardInfo WHERE cardID = #{cardID}")
    CardInfo findById(String cardID);

    /**
     * 根据客户ID查询银行卡信息
     * @param customerID 客户ID
     * @return 银行卡信息列表
     */
    @Select("SELECT * FROM cardInfo WHERE customerID = #{customerID}")
    List<CardInfo> findByCustomerId(Long customerID);

    /**
     * 新增银行卡信息
     * @param cardInfo 银行卡信息对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO cardInfo(cardID, curID, savingID, openDate, openMoney, balance, pass, IsReportLoss, customerID) " +
            "VALUES(#{cardID}, #{curID}, #{savingID}, #{openDate}, #{openMoney}, #{balance}, #{pass}, #{isReportLoss}, #{customerID})")
    int insert(CardInfo cardInfo);

    /**
     * 修改银行卡信息
     * @param cardInfo 银行卡信息对象
     * @return 影响的行数
     */
    @Update("UPDATE cardInfo SET curID = #{curID}, savingID = #{savingID}, " +
            "openMoney = #{openMoney}, balance = #{balance}, pass = #{pass}, " +
            "IsReportLoss = #{isReportLoss} WHERE cardID = #{cardID}")
    int update(CardInfo cardInfo);

    /**
     * 更新银行卡挂失状态
     * @param cardID 银行卡号
     * @param isReportLoss 挂失状态（是/否）
     * @return 影响的行数
     */
    @Update("UPDATE cardInfo SET IsReportLoss = #{isReportLoss} WHERE cardID = #{cardID}")
    int updateReportLoss(@Param("cardID") String cardID, @Param("isReportLoss") String isReportLoss);

    /**
     * 修改银行卡密码
     * @param cardID 银行卡号
     * @param oldPass 旧密码
     * @param newPass 新密码
     * @return 影响的行数
     */
    @Update("UPDATE cardInfo SET pass = #{newPass} WHERE cardID = #{cardID} AND pass = #{oldPass}")
    int updatePassword(@Param("cardID") String cardID, @Param("oldPass") String oldPass, @Param("newPass") String newPass);

    /**
     * 删除银行卡信息
     * @param cardID 银行卡号
     * @return 影响的行数
     */
    @Delete("DELETE FROM cardInfo WHERE cardID = #{cardID}")
    int deleteById(String cardID);

    /**
     * 增加银行卡余额
     * @param cardID 银行卡号
     * @param amount 增加的金额
     * @return 影响的行数
     */
    @Update("UPDATE cardInfo SET balance = balance + #{amount} WHERE cardID = #{cardID}")
    int increaseBalance(@Param("cardID") String cardID, @Param("amount") java.math.BigDecimal amount);

    /**
     * 扣减银行卡余额
     * @param cardID 银行卡号
     * @param amount 扣减的金额
     * @return 影响的行数
     */
    @Update("UPDATE cardInfo SET balance = balance - #{amount} WHERE cardID = #{cardID} AND balance >= #{amount}")
    int decreaseBalance(@Param("cardID") String cardID, @Param("amount") java.math.BigDecimal amount);

    /**
     * 根据关键词查询银行卡信息
     * @param keyword 关键词
     * @return 银行卡信息列表
     */
    @Select("SELECT * FROM cardInfo WHERE cardID LIKE #{keyword} OR customerID LIKE #{keyword}")
    List<CardInfo> searchByKeyword(String keyword);

    /**
     * 根据余额范围查询银行卡信息
     * @param min 最小余额
     * @param max 最大余额
     * @return 银行卡信息列表
     */
    @Select("SELECT * FROM cardInfo WHERE balance BETWEEN #{min} AND #{max}")
    List<CardInfo> findByBalanceRange(java.math.BigDecimal min, java.math.BigDecimal max);
}